package org.dubbo.sample.provider.impl;

import java.util.HashMap;
import java.util.Map;

import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.dubbo.sample.api.User;
import org.dubbo.sample.api.service.UserService;

import com.alibaba.dubbo.rpc.protocol.rest.support.ContentType;

/**
 * 一般应用中，我们建议将annotation放到服务实现类，这样annotation和java实现代码位置更接近，更便于开发和维护。
 * 另外更重要的是，我们一般倾向于避免对接口的污染，保持接口的纯净性和广泛适用性。
 * 但是，如后文所述，如果我们要用dubbo直接开发的消费端来访问此服务，则annotation必须放到接口上。
 * 如果接口和实现类都同时添加了annotation，则实现类的annotation配置会生效，接口上的annotation被直接忽略。
 * 
 * @description 暴露服务的具体实现
 * @author maliqiang 2016年9月30日
 * @version 1.0
 *
 */
@Path("users")
@Consumes({MediaType.APPLICATION_JSON, MediaType.TEXT_XML})
@Produces({MediaType.APPLICATION_JSON, MediaType.TEXT_XML,ContentType.APPLICATION_JSON_UTF_8, ContentType.TEXT_XML_UTF_8})
public class UserServiceImpl implements UserService {
	static Map<String, User> DB = new HashMap<String, User>();
	static{
		DB.put("1002", new User("1002", "张三", "23"));
		DB.put("1000", new User("1000", "李四", "25"));
	}

	
	/**
	 * REST服务中虽然建议使用HTTP协议中四种标准方法POST、DELETE、PUT、GET来分别实现常见的“增删改查”，
	 * 但实际中，我们一般情况直接用POST来实现“增改”，GET来实现“删查”即可（DELETE和PUT甚至会被一些防火墙阻挡）。
	 */
	@GET
	@Path("register")
	public void registerUser(User user) {
		// save the user...
		System.out.println("保存用户信息：" + user.getUserId());
	}

	
	/**
	 * @GET：指定用HTTP GET方法访问
	 * @Path("{id : \d+}")：根据上面的功能需求，访问getUser()的URL应当是“http://localhost:8080/users/ + 任意数字"，
	 * 并且这个数字要被做为参数传入getUser()方法。 这里的annotation配置中，@Path中间的{id: xxx}指定URL相对路径中包含了名为id参数，
	 * 而它的值也将被自动传递给下面用@PathParam("id")修饰的方法参数id。{id:后面紧跟的\d+是一个正则表达式，指定了id参数必须是数字。
	 * @Produces({MediaType.APPLICATION_JSON})：指定getUser()输出JSON格式的数据。可以在接口实现类统一添加。框架会自动将User对象序列化为JSON数据。
	 */
	@GET
	@Path("{id : \\d+}")
	public User getUser(@PathParam("id") Long id) {
		// TO DO Something
		System.out.println("进入查询用户方法...");
		User user = DB.get(id.toString());
		if(null == user){
			return new User("1", "mark", "20");
		}
		return user;
	}
}